import axios from 'axios';
import { notification } from 'antd';

import env from '../request/env';

const codeMessage = {
	200: '服务器成功返回请求的数据。',
	201: '新建或修改数据成功。',
	202: '一个请求已经进入后台排队（异步任务）。',
	204: '删除数据成功。',
	400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
	401: '用户没有权限或权限失效，请重新登录。',
	403: '用户得到授权，但是访问是被禁止的。',
	404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
	406: '请求的格式不可得。',
	410: '请求的资源被永久删除，且不会再得到的。',
	422: '当创建一个对象时，发生一个验证错误。',
	500: '服务器发生错误，请检查服务器。',
	502: '网关错误。',
	503: '服务不可用，服务器暂时过载或维护。',
	504: '网关超时。',
};
type MapCode = 200 | 201 | 202 | 204 | 400 | 401 | 403 | 404 | 406 | 410 | 422 | 500 | 502 | 503 | 504;
console.log(codeMessage[200 as MapCode]);
const handleNetworkError = (response: any) => {
	if (response && response.status) {
		const errorText = codeMessage[response.status as MapCode] || response.statusText;
		const { status, url } = response;
		notification.error({
			message: `请求错误 ${status}: ${url}`,
			description: errorText,
		});
	} else {
		notification.error({
			description: '您的网络发生异常，无法连接服务器',
			message: '网络异常',
		});
	}
};

const handleGeneralError = (data: any) => {
	if (data.code && data.code !== 200) {
		notification.error({
			message: `请求错误 ${data.code}`,
			description: data.msg,
		});
	}
};

const instance = axios.create({
	baseURL: env.apis.base,
});

instance.interceptors.request.use(
	config => config,
	error => Promise.reject(error),
);

instance.interceptors.response.use(
	response => {
		if (response.status !== 200) return Promise.reject(response.data);

		handleGeneralError(response.data);

		return response.data?.data;
	},
	error => {
		handleNetworkError(error.response);

		return Promise.reject(error);
	},
);

export default instance;
